home *** CD-ROM | disk | FTP | other *** search
- #define STRICT
-
- // Includes standard Windows
- #include <windows.h>
- #include <windowsx.h>
- #include <time.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include <memory.h>
- #include <stdio.h>
- #include <math.h>
-
- // Includes D3D
- #define D3D_OVERLOADS
- #include <ddraw.h>
- #include <d3d.h>
- #include <d3dx.h>
-
- // Includes utilitaires D3D
- #include "d3dmath.h"
- #include "d3dutil.h"
- #include "D3DEnum.h"
-
- // Ids Resources
- //#include "resource.h"
-
- // Constantes
- #include "const.h"
-
- // Types
- #include "types.h"
-
- // Variables globales projet
- #include "vars.h"
-
- // Prototypes fonctions autres modules
- #include "proto.h"
-
- // Macros
- #include "macros.h"
-
- #define fswap(f1, f2) { FLOAT f3 = f2 ; f2 = f1 ; f1 = f3; }
-
- void vAddSphere(D3DVECTOR vCenter, float r, int horiz, int vert, BOOL bHalf)
- {
- float hIncr = 2.f * g_PI / horiz;
- float vIncr = g_PI / vert;
- D3DVECTOR a, b, c;
-
- for(int i = 0; i < (bHalf ? vert / 2 : vert) ; i++)
- {
- float rTemp1, rTemp2; // rayon des deux cercles
-
- rTemp1 = (float) sin(i * vIncr) * r;
- rTemp2 = (float) sin((i + 1) * vIncr) * r;
-
- for(int j = 0; j < horiz; j++)
- {
- a.x = (float) cos( j * hIncr) * rTemp1;
- a.y = (float) cos( i * vIncr) * r ;
- a.z = (float) sin( j * hIncr) * rTemp1;
-
- b.x = (float) cos((j + 1) * hIncr) * rTemp1;
- b.y = (float) cos( i * vIncr) * r ;
- b.z = (float) sin((j + 1) * hIncr) * rTemp1;
-
- c.x = (float) cos( j * hIncr) * rTemp2;
- c.y = (float) cos((i + 1) * vIncr) * r ;
- c.z = (float) sin( j * hIncr) * rTemp2;
-
- switch(lWActive)
- {
- case XDC_WID_FACE : // X et Y
- fswap(a.z, a.y); fswap(a.x, a.y);
- fswap(b.z, b.y); fswap(b.x, b.y);
- fswap(c.z, c.y); fswap(c.x, c.y);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- fswap(a.x, a.y); fswap(a.z, a.y);
- fswap(b.x, b.y); fswap(b.z, b.y);
- fswap(c.x, c.y); fswap(c.z, c.y);
- break;
- }
-
- iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
- iMakeVertex(b + vCenter, XDC_ALLOWSAME),
- iMakeVertex(c + vCenter, XDC_ALLOWSAME),
- 0);
-
- a.x = (float) cos((j + 1) * hIncr) * rTemp2;
- a.y = (float) cos((i + 1) * vIncr) * r ;
- a.z = (float) sin((j + 1) * hIncr) * rTemp2;
-
- switch(lWActive)
- {
- case XDC_WID_FACE : // X et Y
- fswap(a.z, a.y); fswap(a.x, a.y);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- fswap(a.x, a.y); fswap(a.z, a.y);
- break;
- }
-
- iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
- iMakeVertex(b + vCenter, XDC_ALLOWSAME),
- iMakeVertex(c + vCenter, XDC_ALLOWSAME),
- 0);
- }
- }
- }
-
- void vAddBoing(D3DVECTOR vCenter, float r)
- {
- int horiz = 14, vert = 6;
- float hIncr = 2.f * g_PI / horiz;
- float vIncr = g_PI / vert;
- D3DVECTOR a, b, c;
-
- for(int i = 0; i < vert; i++)
- {
- float rTemp1, rTemp2; // rayon des deux cercles
-
- rTemp1 = (float) sin(i * vIncr) * r;
- rTemp2 = (float) sin((i + 1) * vIncr) * r;
-
- for(int j = 0; j < horiz; j++)
- {
- a.x = (float) cos( j * hIncr) * rTemp1;
- a.y = (float) cos( i * vIncr) * r ;
- a.z = (float) sin( j * hIncr) * rTemp1;
-
- b.x = (float) cos((j + 1) * hIncr) * rTemp1;
- b.y = (float) cos( i * vIncr) * r ;
- b.z = (float) sin((j + 1) * hIncr) * rTemp1;
-
- c.x = (float) cos( j * hIncr) * rTemp2;
- c.y = (float) cos((i + 1) * vIncr) * r ;
- c.z = (float) sin( j * hIncr) * rTemp2;
-
- switch(lWActive)
- {
- case XDC_WID_FACE : // X et Y
- fswap(a.z, a.y); fswap(a.x, a.y);
- fswap(b.z, b.y); fswap(b.x, b.y);
- fswap(c.z, c.y); fswap(c.x, c.y);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- fswap(a.x, a.y); fswap(a.z, a.y);
- fswap(b.x, b.y); fswap(b.z, b.y);
- fswap(c.x, c.y); fswap(c.z, c.y);
- break;
- }
-
- iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
- iMakeVertex(b + vCenter, XDC_ALLOWSAME),
- iMakeVertex(c + vCenter, XDC_ALLOWSAME),
- ((i & 1)?(j & 1):!(j & 1)) ? 2 : 0);
-
-
- a.x = (float) cos((j + 1) * hIncr) * rTemp2;
- a.y = (float) cos((i + 1) * vIncr) * r ;
- a.z = (float) sin((j + 1) * hIncr) * rTemp2;
-
- switch(lWActive)
- {
- case XDC_WID_FACE : // X et Y
- fswap(a.z, a.y); fswap(a.x, a.y);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- fswap(a.x, a.y); fswap(a.z, a.y);
- break;
- }
-
- iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
- iMakeVertex(b + vCenter, XDC_ALLOWSAME),
- iMakeVertex(c + vCenter, XDC_ALLOWSAME),
- ((i & 1)?(j & 1):!(j & 1)) ? 2 : 0);
-
- }
- }
- }
-
- #define AddTorusCalcX(i,j) ((float) (((r * cos((j) * 2*g_PI/m)) + R) * cos((i) * 2*g_PI/n)))
- #define AddTorusCalcY(i,j) ((float) ( r * sin((j) * 2*g_PI/m)))
- #define AddTorusCalcZ(i,j) ((float) (((r * cos((j) * 2*g_PI/m)) + R) * sin((i) * 2*g_PI/n)))
-
- void vAddTorus(D3DVECTOR vCenter, float R, float r, int n, int m)
- {
- D3DVECTOR a, b, c, d;
-
- for(int i = 0; i <= n; i++)
- for(int j = 0; j <= m; j++)
- {
- a.x = AddTorusCalcX( i , j ); a.y = AddTorusCalcY( i , j ); a.z = AddTorusCalcZ( i , j );
- b.x = AddTorusCalcX( i ,j+1); b.y = AddTorusCalcY( i ,j+1); b.z = AddTorusCalcZ( i ,j+1);
- c.x = AddTorusCalcX(i+1, j ); c.y = AddTorusCalcY(i+1, j ); c.z = AddTorusCalcZ(i+1, j );
- d.x = AddTorusCalcX(i+1,j+1); d.y = AddTorusCalcY(i+1,j+1); d.z = AddTorusCalcZ(i+1,j+1);
-
- switch(lWActive)
- {
- case XDC_WID_FACE : // X et Y
- fswap(a.z, a.y); fswap(a.x, a.y);
- fswap(b.z, b.y); fswap(b.x, b.y);
- fswap(c.z, c.y); fswap(c.x, c.y);
- fswap(d.z, d.y); fswap(d.x, d.y);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- fswap(a.x, a.y); fswap(a.z, a.y);
- fswap(b.x, b.y); fswap(b.z, b.y);
- fswap(c.x, c.y); fswap(c.z, c.y);
- fswap(d.x, d.y); fswap(d.z, d.y);
- break;
- }
-
- iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
- iMakeVertex(b + vCenter, XDC_ALLOWSAME),
- iMakeVertex(c + vCenter, XDC_ALLOWSAME),
- ((i & 1)?(j & 1):!(j & 1)) ? 2 : 0);
-
- iMakeTriangle(iMakeVertex(c + vCenter, XDC_ALLOWSAME),
- iMakeVertex(b + vCenter, XDC_ALLOWSAME),
- iMakeVertex(d + vCenter, XDC_ALLOWSAME),
- ((i & 1)?(j & 1):!(j & 1)) ? 2 : 0);
- }
- }
-
- void vAddDisk(D3DVECTOR vCenter, float r, int iSubdiv)
- {
- float fIncr = 2.f * g_PI / iSubdiv;
- D3DVECTOR a, b;
- int iCenter = iMakeVertex(vCenter, XDC_ALLOWSAME);
-
- for(int j = 0; j < iSubdiv; j++)
- {
- a.x = (float) sin( j * fIncr) * r;
- a.y = (float) cos( j * fIncr) * r;
- b.x = (float) sin((j + 1) * fIncr) * r;
- b.y = (float) cos((j + 1) * fIncr) * r;
- a.z = b.z = 0;
-
- switch(lWActive)
- {
- case XDC_WID_TOP : // X et Z
- fswap(a.y, a.z); fswap(a.x, a.z);
- fswap(b.y, b.z); fswap(b.x, b.z);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- fswap(a.x, a.z); fswap(a.z, a.y);
- fswap(b.x, b.z); fswap(b.z, b.y);
- break;
- }
-
- iMakeTriangle(iCenter,
- iMakeVertex(a + vCenter, XDC_ALLOWSAME),
- iMakeVertex(b + vCenter, XDC_ALLOWSAME),
- (j & 1) ? 0 : 2);
- }
- }
-
- void vAddCircle(D3DVECTOR vCenter, float r, int iSubdiv)
- {
- float fIncr = 2.f * g_PI / iSubdiv;
-
- D3DVECTOR a, b;
-
- for(int j = 0; j < iSubdiv; j++)
- {
- a.x = (float) sin( j * fIncr) * r;
- a.y = (float) cos( j * fIncr) * r;
- b.x = (float) sin((j + 1) * fIncr) * r;
- b.y = (float) cos((j + 1) * fIncr) * r;
- a.z = b.z = 0;
-
- switch(lWActive)
- {
- case XDC_WID_TOP : // X et Z
- fswap(a.y, a.z); fswap(a.x, a.z);
- fswap(b.y, b.z); fswap(b.x, b.z);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- fswap(a.x, a.z); fswap(a.z, a.y);
- fswap(b.x, b.z); fswap(b.z, b.y);
- break;
- }
-
- iMakeEdge(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
- iMakeVertex(b + vCenter, XDC_ALLOWSAME));
- }
- }
-
- void vAddCube(D3DVECTOR vCenter, float r)
- {
- D3DVECTOR v1 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z - r);
- D3DVECTOR v2 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z - r);
- D3DVECTOR v3 = D3DVECTOR(vCenter.x + r, vCenter.y + r, vCenter.z - r);
- D3DVECTOR v4 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z - r);
- D3DVECTOR v5 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z + r);
- D3DVECTOR v6 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z + r);
- D3DVECTOR v7 = D3DVECTOR(vCenter.x + r, vCenter.y + r, vCenter.z + r);
- D3DVECTOR v8 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z + r);
- int i1 = iMakeVertex(v1, XDC_FORCENEW);
- int i2 = iMakeVertex(v2, XDC_FORCENEW);
- int i3 = iMakeVertex(v3, XDC_FORCENEW);
- int i4 = iMakeVertex(v4, XDC_FORCENEW);
- int i5 = iMakeVertex(v5, XDC_FORCENEW);
- int i6 = iMakeVertex(v6, XDC_FORCENEW);
- int i7 = iMakeVertex(v7, XDC_FORCENEW);
- int i8 = iMakeVertex(v8, XDC_FORCENEW);
-
- // Devant
- iMakeTriangle(i1, i2, i3, 0);
- iMakeTriangle(i1, i3, i4, 0);
-
- // Derrière
- iMakeTriangle(i5, i6, i7, 0);
- iMakeTriangle(i5, i7, i8, 0);
-
- // Dessous
- iMakeTriangle(i1, i2, i6, 0);
- iMakeTriangle(i1, i5, i6, 0);
-
- // Dessus
- iMakeTriangle(i3, i4, i8, 0);
- iMakeTriangle(i3, i7, i8, 0);
-
- // Droite
- iMakeTriangle(i2, i3, i7, 0);
- iMakeTriangle(i2, i6, i7, 0);
-
- // Gauche
- iMakeTriangle(i1, i4, i8, 0);
- iMakeTriangle(i1, i5, i8, 0);
- }
-
- void vAddPrism(D3DVECTOR vCenter, float r)
- {
- D3DVECTOR v1, v2, v3, v4;
-
- switch(lWActive)
- {
- case XDC_WID_FACE : // X et Y
- v1 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z - r);
- v2 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z - r);
- v3 = D3DVECTOR(vCenter.x + r, vCenter.y + r, vCenter.z - r);
- v4 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z - r);
- break;
-
- case XDC_WID_TOP : // X et Z
- v1 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z - r);
- v2 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z - r);
- v3 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z + r);
- v4 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z + r);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- v1 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z - r);
- v2 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z - r);
- v3 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z + r);
- v4 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z + r);
- break;
- }
-
- int i1 = iMakeVertex(v1, XDC_FORCENEW);
- int i2 = iMakeVertex(v2, XDC_FORCENEW);
- int i3 = iMakeVertex(v3, XDC_FORCENEW);
- int i4 = iMakeVertex(v4, XDC_FORCENEW);
- int i5 = iMakeVertex(vCenter, XDC_FORCENEW);
-
- iMakeTriangle(i1, i2, i3, 0);
- iMakeTriangle(i1, i3, i4, 0);
-
- iMakeTriangle(i1, i2, i5, 0);
- iMakeTriangle(i2, i3, i5, 0);
- iMakeTriangle(i3, i4, i5, 0);
- iMakeTriangle(i4, i1, i5, 0);
- }
-
- #define XDC_OBJ_CYLN 1
- #define XDC_OBJ_TUBE 2
- #define XDC_OBJ_CONE 3
-
- static void vAddCylOrTubeOrCone(D3DVECTOR vCenter, float r, int iSubdiv, int iObjType)
- {
- float fIncr = 2.f * g_PI / iSubdiv;
- D3DVECTOR a, b, vC1, vC2;
- int iCenter1, iCenter2;
-
- switch(lWActive)
- {
- case XDC_WID_FACE : // X et Y
- vC1 = vCenter - D3DVECTOR(0., 0., r);
- vC2 = vCenter + D3DVECTOR(0., 0., r);
- break;
-
- case XDC_WID_TOP : // X et Z
- vC1 = vCenter - D3DVECTOR(0., r, 0.);
- vC2 = vCenter + D3DVECTOR(0., r, 0.);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- vC1 = vCenter - D3DVECTOR(r, 0., 0.);
- vC2 = vCenter + D3DVECTOR(r, 0., 0.);
- break;
- }
-
- switch(iObjType)
- {
- case XDC_OBJ_CYLN :
- case XDC_OBJ_CONE :
- iCenter1 = iMakeVertex(vC1, XDC_FORCENEW);
- iCenter2 = iMakeVertex(vC2, XDC_FORCENEW);
- break;
-
- }
-
- for(int j = 0; j < iSubdiv; j++)
- {
- int iA1, iA2, iB1, iB2;
-
- a.x = (float) sin( j * fIncr) * r;
- a.y = (float) cos( j * fIncr) * r;
- b.x = (float) sin((j + 1) * fIncr) * r;
- b.y = (float) cos((j + 1) * fIncr) * r;
- a.z = b.z = 0;
-
- switch(lWActive)
- {
- case XDC_WID_TOP : // X et Z
- fswap(a.y, a.z); fswap(a.x, a.z);
- fswap(b.y, b.z); fswap(b.x, b.z);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- fswap(a.x, a.z); fswap(a.z, a.y);
- fswap(b.x, b.z); fswap(b.z, b.y);
- break;
- }
-
- switch(iObjType)
- {
- case XDC_OBJ_CYLN :
- case XDC_OBJ_TUBE :
-
- iA1 = iMakeVertex(a + vC1, XDC_ALLOWSAME),
- iB1 = iMakeVertex(b + vC1, XDC_ALLOWSAME),
- iA2 = iMakeVertex(a + vC2, XDC_ALLOWSAME),
- iB2 = iMakeVertex(b + vC2, XDC_ALLOWSAME);
-
- iMakeTriangle(iA1, iB1, iA2, (j & 1) ? 0 : 2);
- iMakeTriangle(iA2, iB1, iB2, (j & 1) ? 0 : 2);
-
- if (iObjType == XDC_OBJ_TUBE) break;
-
- iMakeTriangle(iCenter1, iA1, iB1, (j & 1) ? 0 : 2);
- iMakeTriangle(iCenter2, iA2, iB2, (j & 1) ? 0 : 2);
- break;
-
- case XDC_OBJ_CONE :
- iA1 = iMakeVertex(a + vC1, XDC_ALLOWSAME),
- iB1 = iMakeVertex(b + vC1, XDC_ALLOWSAME),
-
- iMakeTriangle(iCenter1, iA1, iB1, (j & 1) ? 0 : 2);
- iMakeTriangle(iCenter2, iA1, iB1, (j & 1) ? 0 : 2);
- break;
- }
- }
- }
-
- void vAddCyl(D3DVECTOR vCenter, float r, int iSubdiv)
- {
- vAddCylOrTubeOrCone(vCenter, r, iSubdiv, XDC_OBJ_CYLN);
- }
-
- void vAddTube(D3DVECTOR vCenter, float r, int iSubdiv)
- {
- vAddCylOrTubeOrCone(vCenter, r, iSubdiv, XDC_OBJ_TUBE);
- }
-
- void vAddCone(D3DVECTOR vCenter, float r, int iSubdiv)
- {
- vAddCylOrTubeOrCone(vCenter, r, iSubdiv, XDC_OBJ_CONE);
- }
-
-